]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
UserWidget: replace vfunc_destroy override with a signal connection
authorGiovanni Campagna <gcampagna@src.gnome.org>
Mon, 2 Dec 2013 22:50:45 +0000 (23:50 +0100)
committerGiovanni Campagna <gcampagna@src.gnome.org>
Mon, 2 Dec 2013 22:59:50 +0000 (23:59 +0100)
The destroy vfunc might be called during object finalization, and
we can't call any JS from a GC finalizer, so we use a signal
connection instead, as that is removed by GObject the first time
the object is disposed.

https://bugzilla.gnome.org/show_bug.cgi?id=719730

js/ui/userWidget.js

index e8574c4db0861af81bd2cd9893c0546d0d8633d0..b16f9e336dc657997c0cf685488b95371eb2ec65 100644 (file)
@@ -79,9 +79,16 @@ const UserWidgetLabel = new Lang.Class({
         this._userLoadedId = this._user.connect('notify::is-loaded', Lang.bind(this, this._updateUser));
         this._userChangedId = this._user.connect('changed', Lang.bind(this, this._updateUser));
         this._updateUser();
+
+        // We can't override the destroy vfunc because that might be called during
+        // object finalization, and we can't call any JS inside a GC finalize callback,
+        // so we use a signal, that will be disconnected by GObject the first time
+        // the actor is destroyed (which is guaranteed to be as part of a normal
+        // destroy() call from JS, possibly from some ancestor)
+        this.connect('destroy', Lang.bind(this, this._onDestroy));
     },
 
-    vfunc_destroy: function() {
+    _onDestroy: function() {
         if (this._userLoadedId != 0) {
             this._user.disconnect(this._userLoadedId);
             this._userLoadedId = 0;
@@ -91,8 +98,6 @@ const UserWidgetLabel = new Lang.Class({
             this._user.disconnect(this._userChangedId);
             this._userChangedId = 0;
         }
-
-        this.parent();
     },
 
     vfunc_allocate: function(box, flags) {